package br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.model.source;
import java.io.File;
import java.util.List;
import org.apache.tools.ant.DirectoryScanner;
import org.joda.time.DateMidnight;
import org.joda.time.Interval;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.util.FileUtils;
public abstract class VersionControlManager {
/**
* URL do repositorio.
*/
protected String repository_url;
/**
* Intervalo de tempo para o qual a analise deve ser feita.
*/
protected Interval time_interval;
/**
* Diretorio onde o codigo fonte sera baixado.
*/
protected File src_path;
protected VersionControlManager(String repository_url,
String start_date_str, String end_date_str) {
this.repository_url = repository_url;
this.time_interval = getIntervalFromParams(start_date_str, end_date_str);
}
/**
* Faz o download do codigo do fonte no repositorio, e armazena no local
* passado como parametro (path). Codigo baixado corresponde a versao do
* final do periodo.
*
* @param path
* diretorio onde codigo fonte sera armazenado.
*/
public abstract void downloadCode(File path) throws Exception;
/**
* Faz o download do log do repositorio
*
* @return
*/
public abstract List<Commit> getCommits();
public File getSrcPath() {
return src_path;
}
/**
* Remove as classes de teste do sistema, para que elas nao entrem na
* analise. Todos os diretorios cujo nome comeca com 'test' (test*) serão
* excluídos.
*/
public void removeTestClasses() {
System.out.println("Deleting test folders");
DirectoryScanner scanner = new DirectoryScanner();
String[] includes = { "**/test*" };
scanner.setIncludes(includes);
scanner.setBasedir(src_path);
scanner.setCaseSensitive(false);
scanner.scan();
String[] included_dirs = scanner.getIncludedDirectories();
for (String test_dir : included_dirs) {
File dirToDelete = new File(src_path, test_dir);
if (dirToDelete.exists())
FileUtils.deleteRecursive(dirToDelete);
}
}
/**
* Transforma duas datas textuais (ex: "2008-06-14") em um objeto Interval,
* que representa um intervalo de tempo.
*/
private Interval getIntervalFromParams(String start_date_str,
String end_date_str) {
DateTimeFormatter formatter = DateTimeFormat.forPattern("y-M-d");
// DateMidnight e um DateTime onde a hora e sempre 00:00.
DateMidnight start_date = new DateMidnight(
formatter.parseDateTime(start_date_str));
DateMidnight end_date = new DateMidnight(
formatter.parseDateTime(end_date_str));
return new Interval(start_date, end_date);
}
}